Introducción a Tidydata y al uso de las funciones de pivot_longer y pivot_wider
🔴 1. Introducción a tidydata
Fig.01: Julie Lowndes y Allison Horst, 2020, Tidy data for Efficiency, Reproducibility, and Collaboration
Dentro de cualquier análisis estadístico el mayor tiempo destinado está en función al ordenamiento y entendimiento de los datos. Tener datos ordenados (tidydata) significa tener una base datos con estructuras adecuadas, donde cada registro representa una fila, cada variable representa una columna y cada celda contiene una simple medida (Hadley Wickham,2014). En la siguiente imagen se adjunta una infografía donde se detalla este concepto.
Fig.02: Julie Lowndes y Allison Horst, 2020, Tidy data for Efficiency, Reproducibility, and Collaboration
Sin embargo un tidydata puede estar representado en multiples formas, y esto lo podemos observar en las siguientes estructuras.
table1
#> # A tibble: 6 x 4
#> country year cases population
#> <chr> <int> <int> <int>
#> 1 Afghanistan 1999 745 19987071
#> 2 Afghanistan 2000 2666 20595360
#> 3 Brazil 1999 37737 172006362
#> 4 Brazil 2000 80488 174504898
#> 5 China 1999 212258 1272915272
#> 6 China 2000 213766 1280428583
table2
#> # A tibble: 12 x 4
#> country year type count
#> <chr> <int> <chr> <int>
#> 1 Afghanistan 1999 cases 745
#> 2 Afghanistan 1999 population 19987071
#> 3 Afghanistan 2000 cases 2666
#> 4 Afghanistan 2000 population 20595360
#> 5 Brazil 1999 cases 37737
#> 6 Brazil 1999 population 172006362
#> # … with 6 more rows
table3
#> # A tibble: 6 x 3
#> country year rate
#> * <chr> <int> <chr>
#> 1 Afghanistan 1999 745/19987071
#> 2 Afghanistan 2000 2666/20595360
#> 3 Brazil 1999 37737/172006362
#> 4 Brazil 2000 80488/174504898
#> 5 China 1999 212258/1272915272
#> 6 China 2000 213766/1280428583
# Spread across two tibbles
table4a # cases
#> # A tibble: 3 x 3
#> country `1999` `2000`
#> * <chr> <int> <int>
#> 1 Afghanistan 745 2666
#> 2 Brazil 37737 80488
#> 3 China 212258 213766
table4b # population
#> # A tibble: 3 x 3
#> country `1999` `2000`
#> * <chr> <int> <int>
#> 1 Afghanistan 19987071 20595360
#> 2 Brazil 172006362 174504898
#> 3 China 1272915272 1280428583Finalmente, tener un tidydata nos permite tener muchas ventajas desde ser más eficientes en nuestro análisis,tener una mayor facilidad al momento de colaborar con multiples usarios y realizar practicas de reproducibilidad.
Fig.03: Julie Lowndes y Allison Horst, 2020, Tidy data for Efficiency, Reproducibility, and Collaboration
🔴 2. Manipulando datos desordenados para optener datos en estructura tidy
Para este ejemplo usaremos una base de datos que contiene casos de personas fallecidas a causa del coranovirus a nivel de país, este dataset está alojada en el siguiente repositorio de GitHub (click aquí) del Portal de datos abiertos.
Fig. 04: Personas fallecidas por coranovirus a nivel global
✅ 2.1 Lectura de datos
data <- read_csv("https://raw.githubusercontent.com/CSSEGISandData/COVID-19/master/csse_covid_19_data/csse_covid_19_time_series/time_series_covid19_deaths_global.csv")head(data)## # A tibble: 6 × 676
## `Province/State` `Country/Region` Lat Long `1/22/20` `1/23/20` `1/24/20`
## <chr> <chr> <dbl> <dbl> <dbl> <dbl> <dbl>
## 1 <NA> Afghanistan 33.9 67.7 0 0 0
## 2 <NA> Albania 41.2 20.2 0 0 0
## 3 <NA> Algeria 28.0 1.66 0 0 0
## 4 <NA> Andorra 42.5 1.52 0 0 0
## 5 <NA> Angola -11.2 17.9 0 0 0
## 6 <NA> Antigua and Barbu… 17.1 -61.8 0 0 0
## # … with 669 more variables: 1/25/20 <dbl>, 1/26/20 <dbl>, 1/27/20 <dbl>,
## # 1/28/20 <dbl>, 1/29/20 <dbl>, 1/30/20 <dbl>, 1/31/20 <dbl>, 2/1/20 <dbl>,
## # 2/2/20 <dbl>, 2/3/20 <dbl>, 2/4/20 <dbl>, 2/5/20 <dbl>, 2/6/20 <dbl>,
## # 2/7/20 <dbl>, 2/8/20 <dbl>, 2/9/20 <dbl>, 2/10/20 <dbl>, 2/11/20 <dbl>,
## # 2/12/20 <dbl>, 2/13/20 <dbl>, 2/14/20 <dbl>, 2/15/20 <dbl>, 2/16/20 <dbl>,
## # 2/17/20 <dbl>, 2/18/20 <dbl>, 2/19/20 <dbl>, 2/20/20 <dbl>, 2/21/20 <dbl>,
## # 2/22/20 <dbl>, 2/23/20 <dbl>, 2/24/20 <dbl>, 2/25/20 <dbl>, …
Como podemos observar tenemos un conjunto de datos donde las fechas están almacenas como columnas, esté debería estár almacenado en una sola columna llamada años y cada país debería tener la suma total de personas fallecidas. Para estructurar los datos de forma correcta usaremos dos funciones estás son pivot_longer() y pivot_wider().
Fig. 05: Infografía de pivot realizado por Dr. Peter D.R. Higgins
✅ 2.2 Untidy data ▶ tidydata
La funcion pivot_longer convierte los datos de un formato ancho a uno largo
Fig. 06: Transformación de datos,2021,Data Analytics Coding Fundamentals (
data %>%
pivot_longer(
cols = !c("Province/State","Country/Region","Lat","Long"),
names_to = "years",
values_to = "fallecidos",
values_drop_na = TRUE
) %>%
head()## # A tibble: 6 × 6
## `Province/State` `Country/Region` Lat Long years fallecidos
## <chr> <chr> <dbl> <dbl> <chr> <dbl>
## 1 <NA> Afghanistan 33.9 67.7 1/22/20 0
## 2 <NA> Afghanistan 33.9 67.7 1/23/20 0
## 3 <NA> Afghanistan 33.9 67.7 1/24/20 0
## 4 <NA> Afghanistan 33.9 67.7 1/25/20 0
## 5 <NA> Afghanistan 33.9 67.7 1/26/20 0
## 6 <NA> Afghanistan 33.9 67.7 1/27/20 0
De está estructura de datos podemos notar que en la primera columna presenta datos faltantes (NA), para remover usaremos la función drop_na especificando el nombre de la columna.
data %>%
pivot_longer(
cols = !c("Province/State","Country/Region","Lat","Long"),
names_to = "years",
values_to = "fallecidos",
values_drop_na = TRUE
) %>%
drop_na(`Province/State`) -> data_long
data_long## # A tibble: 58,464 × 6
## `Province/State` `Country/Region` Lat Long years fallecidos
## <chr> <chr> <dbl> <dbl> <chr> <dbl>
## 1 Australian Capital Territory Australia -35.5 149. 1/22/20 0
## 2 Australian Capital Territory Australia -35.5 149. 1/23/20 0
## 3 Australian Capital Territory Australia -35.5 149. 1/24/20 0
## 4 Australian Capital Territory Australia -35.5 149. 1/25/20 0
## 5 Australian Capital Territory Australia -35.5 149. 1/26/20 0
## 6 Australian Capital Territory Australia -35.5 149. 1/27/20 0
## 7 Australian Capital Territory Australia -35.5 149. 1/28/20 0
## 8 Australian Capital Territory Australia -35.5 149. 1/29/20 0
## 9 Australian Capital Territory Australia -35.5 149. 1/30/20 0
## 10 Australian Capital Territory Australia -35.5 149. 1/31/20 0
## # … with 58,454 more rows
Ahora de este formato largo podemos pasar a un formato ancho usando la función pivot_wider.
data_long %>%
pivot_wider(
names_from = years,
values_from = fallecidos) -> data_wide
data_wide## # A tibble: 87 × 676
## `Province/State` `Country/Region` Lat Long `1/22/20` `1/23/20` `1/24/20`
## <chr> <chr> <dbl> <dbl> <dbl> <dbl> <dbl>
## 1 Australian Capita… Australia -35.5 149. 0 0 0
## 2 New South Wales Australia -33.9 151. 0 0 0
## 3 Northern Territory Australia -12.5 131. 0 0 0
## 4 Queensland Australia -27.5 153. 0 0 0
## 5 South Australia Australia -34.9 139. 0 0 0
## 6 Tasmania Australia -42.9 147. 0 0 0
## 7 Victoria Australia -37.8 145. 0 0 0
## 8 Western Australia Australia -32.0 116. 0 0 0
## 9 Alberta Canada 53.9 -117. 0 0 0
## 10 British Columbia Canada 53.7 -128. 0 0 0
## # … with 77 more rows, and 669 more variables: 1/25/20 <dbl>, 1/26/20 <dbl>,
## # 1/27/20 <dbl>, 1/28/20 <dbl>, 1/29/20 <dbl>, 1/30/20 <dbl>, 1/31/20 <dbl>,
## # 2/1/20 <dbl>, 2/2/20 <dbl>, 2/3/20 <dbl>, 2/4/20 <dbl>, 2/5/20 <dbl>,
## # 2/6/20 <dbl>, 2/7/20 <dbl>, 2/8/20 <dbl>, 2/9/20 <dbl>, 2/10/20 <dbl>,
## # 2/11/20 <dbl>, 2/12/20 <dbl>, 2/13/20 <dbl>, 2/14/20 <dbl>, 2/15/20 <dbl>,
## # 2/16/20 <dbl>, 2/17/20 <dbl>, 2/18/20 <dbl>, 2/19/20 <dbl>, 2/20/20 <dbl>,
## # 2/21/20 <dbl>, 2/22/20 <dbl>, 2/23/20 <dbl>, 2/24/20 <dbl>, …
🔴 Referencias
Wickham, H. . (2014). Tidy Data. Journal of Statistical Software, 59(10), 1–23. https://doi.org/10.18637/jss.v059.i10
Derek Corcoran,2019,Manipulación de datos e investigación reproducible en R, https://bookdown.org/content/3515/tidydata.html
The Ocean Health Index Team, 2019,Introduction to Open Data Science,http://ohi-science.org/data-science-training/
Openscapes, 2020, https://www.openscapes.org/blog/2020/10/12/tidy-data/
Martin Monkman,2021,Data Analytics Coding Fundamentals (BIDA302),https://bookdown.org/martin_monkman/DataAnalyticsCodingFundamentals/